package LeetCode_力扣;

/** 83. 删除排序链表中的重复元素
 * 给定一个已排序的链表的头 head ，
 * 删除所有重复的元素，使每个元素只出现一次 。返回 已排序的链表 。
 */

/**
 * 思路1：弄个双指针，prve 和 node，因为是排序的，当prve == node时候，
 * prve肯定是第一个重新元素，所以prve所指向的值不用删，让node往后跳就行
 */
//public class deleteDuplicates_83 {
//    public ListNode deleteDuplicates(ListNode head) {
//
//        //特殊情况：当head为空，或者只有一个元素的时候，肯定没有重复元素存在
//        if(head == null || head.next == null){
//            return head;
//        }
//
//        ListNode prve = head;
//        ListNode node = head.next;
//
//        while(node != null){
//
//            if(prve.val == node.val){
//                //前后相等的时候，出现重复元素
//                node = node.next;
//                prve.next = node;//更新prve所指向的地址
//            }else{
//                //两个数不相等，依次向后移动
//                prve = node;
//                node = node.next;
//            }
//        }
//        return head;
//    }
//}

/**
 *思路2：用递归方法。可以把单链表进行拆分。我们只处理头节点，
 * 剩下的交给子方法去处理，让它把处理完的节点方法回来，让头节点.next重新接受一下
 * 最后我们比较 头节点，和返回回来的第一个节点进行比较处理。
 */

//public class deleteDuplicates_83 {
//    public ListNode deleteDuplicates(ListNode head) {
//
//        if(head == null || head.next == null){
//            return head;
//        }else{
//            //到这里说明至少存在两个节点，可能会出现重复元素
//            head.next = deleteDuplicates(head.next);
//            if(head.val == head.next.val){
//                return head.next;//正在删除还得看这步
//            }
//            return head;
//        }
//
//    }
//}
//class ListNode {
//    int val;
//    ListNode next;
//
//    ListNode() {
//    }
//
//    ListNode(int val) {
//        this.val = val;
//    }
//
//    ListNode(int val, ListNode next) {
//        this.val = val;
//        this.next = next;
//    }
//}